# src/step2_sentence_extractor.py
import os
import json

# 导入项目配置和工具函数
from config import (
    EXPANDED_CLIMATE_DICT_FILE, EXPANDED_RISK_DICT_FILE,
    CANDIDATE_SENTENCES_FILE
)
from src.utils import setup_logger, load_text_file, save_json_file, get_progress_bar
from src.text_preprocessor import process_all_text_files  # 用于独立测试时获取句子
from config import ANNUAL_REPORTS_DIR, CSR_REPORTS_DIR  # 用于独立测试时获取文件路径

# 为此模块设置独立的日志记录器
logger = setup_logger(__name__, "step2_sentence_extraction.log")


def find_matching_sentences(all_sentences, climate_words, risk_words):
    """
    从句子列表中找出同时包含气候词和风险词的句子。

    Args:
        all_sentences (list of str): 所有待检查的句子列表。
        climate_words (set of str): 气候相关的关键词集合。
        risk_words (set of str): 风险相关的关键词集合。

    Returns:
        list of str: 包含同时匹配两类关键词的句子列表。
    """
    matching_sentences = []
    if not all_sentences:
        logger.warning("输入的句子列表为空。")
        return []
    if not climate_words:
        logger.warning("气候词库为空，无法进行句子匹配。")
        return []
    if not risk_words:
        logger.warning("风险词库为空，无法进行句子匹配。")
        return []

    logger.info(f"开始从 {len(all_sentences)} 个句子中查找匹配项...")
    logger.info(f"气候词库大小: {len(climate_words)}, 风险词库大小: {len(risk_words)}")

    # 使用tqdm显示进度
    pbar = get_progress_bar(all_sentences, desc="Finding matching sentences")

    for sentence in pbar:
        # 检查句子是否包含至少一个气候词
        found_climate_word = False
        for c_word in climate_words:
            if c_word in sentence:  # 全字匹配
                found_climate_word = True
        if not found_climate_word:
            continue  # 如果不包含气候词，则跳过这个句子

        # 如果包含气候词，再检查是否包含至少一个风险词
        found_risk_word = False
        for r_word in risk_words:
            if r_word in sentence:  # 全字匹配
                found_risk_word = True

        if found_risk_word:  # 必须同时包含气候词和风险词
            matching_sentences.append(sentence)
            logger.debug(f"匹配到句子: '{sentence[:100]}...'")

    logger.info(f"查找完毕。共找到 {len(matching_sentences)} 个同时包含气候词和风险词的句子。")
    return matching_sentences


def run_sentence_extraction_step(all_sentences):
    """
    执行相似句子查找步骤的主函数。
    Args:
        all_sentences (list): 从所有报告中预处理得到的句子列表。
    """
    logger.info("开始执行步骤2：相似句子查找...")

    # 1. 加载扩展后的词典
    logger.info(f"加载扩展后的气候词典: {EXPANDED_CLIMATE_DICT_FILE}")
    climate_words_list = load_text_file(EXPANDED_CLIMATE_DICT_FILE)
    if not climate_words_list:
        logger.error(f"扩展后的气候词典加载失败或为空: {EXPANDED_CLIMATE_DICT_FILE}")
        logger.error("请确保步骤1已成功运行并生成了此文件。")
        return
    climate_words_set = set(climate_words_list)

    logger.info(f"加载扩展后的风险词典: {EXPANDED_RISK_DICT_FILE}")
    risk_words_list = load_text_file(EXPANDED_RISK_DICT_FILE)
    if not risk_words_list:
        logger.error(f"扩展后的风险词典加载失败或为空: {EXPANDED_RISK_DICT_FILE}")
        logger.error("请确保步骤1已成功运行并生成了此文件。")
        return
    risk_words_set = set(risk_words_list)

    # 2. 查找匹配的句子
    candidate_sentences = find_matching_sentences(all_sentences, climate_words_set, risk_words_set)

    # 3. 保存结果
    # 将结果保存为JSON，每个元素是一个句子字符串
    logger.info(f"将候选句子保存到: {CANDIDATE_SENTENCES_FILE}")
    save_json_file(candidate_sentences, CANDIDATE_SENTENCES_FILE)

    logger.info("步骤2：相似句子查找全部完成。")


if __name__ == '__main__':
    # 此部分用于独立测试 step2_sentence_extractor.py
    logger.info("独立运行相似句子查找模块测试...")

    # 1. 准备测试用的扩展词典 (如果不存在则创建)
    #    这些文件通常由步骤1生成
    if not os.path.exists(EXPANDED_CLIMATE_DICT_FILE):
        logger.warning(f"测试用的扩展气候词典 {EXPANDED_CLIMATE_DICT_FILE} 不存在，将创建示例文件。")
        save_text_list(["气候变化", "极端天气", "碳排放", "全球变暖", "温室气体", "低碳"], EXPANDED_CLIMATE_DICT_FILE)

    if not os.path.exists(EXPANDED_RISK_DICT_FILE):
        logger.warning(f"测试用的扩展风险词典 {EXPANDED_RISK_DICT_FILE} 不存在，将创建示例文件。")
        save_text_list(["市场风险", "操作风险", "信用风险", "金融风险", "经营风险", "波动"], EXPANDED_RISK_DICT_FILE)

    # 2. 获取所有文本文件的路径 (年报和CSR报告)
    #    与步骤1的测试类似，这里为了快速测试，可能不会处理所有文件
    logger.info("正在收集测试文件路径...")
    annual_report_files = []
    if os.path.exists(ANNUAL_REPORTS_DIR):
        for year_dir in os.listdir(ANNUAL_REPORTS_DIR):
            year_path = os.path.join(ANNUAL_REPORTS_DIR, year_dir)
            if os.path.isdir(year_path):
                for filename in os.listdir(year_path):
                    if filename.endswith(".txt"):
                        annual_report_files.append(os.path.join(year_path, filename))
    else:
        logger.warning(f"年报目录 {ANNUAL_REPORTS_DIR} 不存在。")

    csr_report_files = []
    if os.path.exists(CSR_REPORTS_DIR):
        for year_dir in os.listdir(CSR_REPORTS_DIR):
            year_path = os.path.join(CSR_REPORTS_DIR, year_dir)
            if os.path.isdir(year_path):
                for filename in os.listdir(year_path):
                    if filename.endswith(".txt"):
                        csr_report_files.append(os.path.join(year_path, filename))
    else:
        logger.warning(f"CSR报告目录 {CSR_REPORTS_DIR} 不存在。")

    all_report_files = annual_report_files + csr_report_files

    # 3. 调用文本预处理模块获取所有句子
    #    在实际的main.py中，这一步的结果会被传递过来或从文件加载
    if not all_report_files:
        logger.warning("未找到报告文件，将使用预置的少量示例文本进行句子提取测试。")
        all_sentences_for_testing = [
            "气候变化带来了严峻的市场风险。",
            "极端天气事件可能引发操作风险和经营风险。",
            "公司关注碳排放问题，并评估其对信用风险的影响。",
            "全球变暖是重要的议题。",  # 只含气候词
            "金融市场的波动性很大。",  # 只含风险词
            "我们致力于可持续发展，减少环境足迹。"  # 都不含
        ]
    else:
        logger.info(f"找到 {len(all_report_files)} 个报告文件，开始预处理以提取句子...")
        # 为了测试，我们只取少量文件，避免预处理时间过长
        # test_files_sample = all_report_files[:5] if len(all_report_files) > 5 else all_report_files
        # logger.info(f"将使用 {len(test_files_sample)} 个文件进行预处理测试。")
        # all_sentences_from_reports = process_all_text_files(test_files_sample)

        # **在实际项目中，你应该使用 all_report_files 来获取所有句子**
        logger.warning("为了加速独立测试，将使用预置的少量示例文本进行句子提取测试。")
        logger.warning("在实际项目中，请确保使用 'process_all_text_files(all_report_files)' 加载所有报告。")
        all_sentences_for_testing = [
            "这是一个关于气候变化的测试句子，其中提到了全球变暖和碳排放，以及极端天气事件，这些都可能带来市场风险。",
            "企业面临的市场风险不容小觑，同时操作风险和信用风险也需要得到妥善管理，尤其是在气候变化背景下。",
            "可持续发展要求我们关注环境风险，并采取措施应对气候变化带来的挑战和潜在的经营风险。",
            "金融市场的波动性带来了投资风险，投资者应谨慎评估。",
            "低碳经济是未来的发展方向，旨在减少温室气体排放，降低转型风险。",
            "供应链中断可能引发严重的经营风险，极端天气是诱因之一。",
            "单纯讨论天气好坏。",
            "公司的财务状况良好，风险可控。"
        ]

    if not all_sentences_for_testing:
        logger.error("从报告中未能提取到任何句子，无法进行句子查找。")
    else:
        logger.info(f"从示例文本中提取到 {len(all_sentences_for_testing)} 个句子用于测试。")
        # 运行句子提取步骤
        run_sentence_extraction_step(all_sentences_for_testing)

    logger.info("相似句子查找模块独立测试运行结束。")
    logger.info(f"请检查输出文件: {CANDIDATE_SENTENCES_FILE}")

